package br.pesquisa.lsystem.gui;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import br.pesquisa.lsystem.Alfabeto;
import br.pesquisa.lsystem.Celula;
import br.pesquisa.lsystem.Gramatica;
import br.pesquisa.lsystem.Interpretador;
import br.pesquisa.lsystem.Producao;
import br.pesquisa.lsystem.Celula.Sentido;

@SuppressWarnings("serial")
public class Application extends JFrame {

	private Interpretador<Celula> interpretador;

	private JDesktopPane desktopPane;

	private MainFrame mainFrame;
	private AlfabetoFrame alfabetoFrame;
	private ConfigFrame configFrame;
	private ProducoesFrame producoesFrame;

	public Application() {
		super("L-System");
	}

	public Interpretador<Celula> getInterpretador() {
		return interpretador;
	}

	public void setInterpretador(Interpretador<Celula> interpretador) {
		this.interpretador = interpretador;
	}

	public MainFrame getMainFrame() {
		return mainFrame;
	}

	public void setMainFrame(MainFrame mainFrame) {
		this.mainFrame = mainFrame;
	}

	public AlfabetoFrame getAlfabetoFrame() {
		return alfabetoFrame;
	}

	public void setAlfabetoFrame(AlfabetoFrame alfabetoFrame) {
		this.alfabetoFrame = alfabetoFrame;
	}

	public ConfigFrame getConfigFrame() {
		return configFrame;
	}

	public void setConfigFrame(ConfigFrame configFrame) {
		this.configFrame = configFrame;
	}

	public ProducoesFrame getProducoesFrame() {
		return producoesFrame;
	}

	public void setProducoesFrame(ProducoesFrame producoesFrame) {
		this.producoesFrame = producoesFrame;
	}

	public void init() {
		desktopPane = new JDesktopPane();
		setContentPane(desktopPane);
		setJMenuBar(createMenuBar());

		createInterpretador();

		createAlfabetoFrame();
		desktopPane.add(getAlfabetoFrame());
		createProducoesFrame();
		desktopPane.add(getProducoesFrame());
		createConfigFrame();
		desktopPane.add(getConfigFrame());
		createMainFrame();
		getAlfabetoFrame().setMainFrame(getMainFrame());
		desktopPane.add(getMainFrame());

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	protected JMenuBar createMenuBar() {
		JMenuBar menuBar = new JMenuBar();
		JMenu menu = new JMenu("Menu");
//		JMenuItem resetItem = new JMenuItem("Limpar");
//		menu.add(resetItem);
//		menu.addSeparator();
		JMenuItem exitItem = new JMenuItem("Sair");
		exitItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		menu.add(exitItem);
		menuBar.add(menu);

//		JMenu viewMenu = new JMenu("Mostrar");
//		JMenuItem alfabetoItem = new JMenuItem("Mostrar Alfabeto");
//		viewMenu.add(alfabetoItem);
//		JMenuItem producoesItem = new JMenuItem("Mostrar Producoes");
//		viewMenu.add(producoesItem);
//		JMenuItem configItem = new JMenuItem("Mostrar Configuracoes");
//		viewMenu.add(configItem);
//		menuBar.add(viewMenu);

		return menuBar;
	}

	protected void createInterpretador() {
		Celula largeCell = new Celula("L", Sentido.direita);
		Celula smallCell = new Celula("S", Sentido.direita);

		setInterpretador(new Interpretador<Celula>());
		getInterpretador().setAnimar(true);
		getInterpretador().setNumeroIteracoes(10);
		getInterpretador().setDelay(100);

		getInterpretador().setGramatica(new Gramatica<Celula>());
		getInterpretador().getGramatica().setAlfabeto(new Alfabeto<Celula>());
		getInterpretador().getGramatica().getAxioma().add(largeCell);
		getInterpretador().getGramatica().getAxioma().add(smallCell);

		getInterpretador().getGramatica().getAlfabeto().adicionar(largeCell);
		getInterpretador().getGramatica().getAlfabeto().adicionar(smallCell);

		Producao<Celula> producao = new Producao<Celula>();
		producao.setPredecessor(largeCell);
		producao.getSucessor().add(largeCell);
		producao.getSucessor().add(smallCell);
		getInterpretador().getGramatica().adicionarProducao(producao);

		producao = new Producao<Celula>();
		producao.setPredecessor(smallCell);
		producao.getSucessor().add(largeCell);
		getInterpretador().getGramatica().adicionarProducao(producao);
	}

	protected void createMainFrame() {
		setMainFrame(new MainFrame());
		getMainFrame().setInterpretador(getInterpretador());
		getMainFrame().init();
		getMainFrame().setClosable(false);
		getMainFrame().setSize(getWidth() - (100 + getAlfabetoFrame().getWidth()),
				(int) (getHeight()*0.9));
		getMainFrame().setResizable(true);
		getMainFrame().setVisible(true);
	}

	protected void createAlfabetoFrame() {
		setAlfabetoFrame(new AlfabetoFrame());
		getAlfabetoFrame().setGramatica(getInterpretador().getGramatica());
		getAlfabetoFrame().init();
		getAlfabetoFrame().setSize(380, 230);
		getAlfabetoFrame().setClosable(true);
		getAlfabetoFrame().setResizable(true);
		getAlfabetoFrame().setLocation(getWidth() - getAlfabetoFrame().getWidth(), 0);

		getAlfabetoFrame().setVisible(true);
	}

	protected void createProducoesFrame() {
		setProducoesFrame(new ProducoesFrame());
		getProducoesFrame().setGramatica(getInterpretador().getGramatica());
		getProducoesFrame().init();
		getProducoesFrame().setSize(380, 230);
		getProducoesFrame().setClosable(true);
		getProducoesFrame().setResizable(true);
		getProducoesFrame().setLocation(getWidth() - getProducoesFrame().getWidth(),
				getAlfabetoFrame().getHeight());

		getProducoesFrame().setVisible(true);
	}

	protected void createConfigFrame() {
		setConfigFrame(new ConfigFrame());
		getConfigFrame().setInterpretador(getInterpretador());
		getConfigFrame().init();
		getConfigFrame().setSize(380, 160);
		getConfigFrame().setClosable(true);
		getConfigFrame().setResizable(true);
		getConfigFrame().setLocation(getWidth() - getConfigFrame().getWidth(),
				getAlfabetoFrame().getHeight() + getProducoesFrame().getHeight());

		getConfigFrame().setVisible(true);
	}

	public static void main(String[] args) {
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Dimension screenDimension = toolkit.getScreenSize();
		screenDimension.setSize(screenDimension.getWidth()*0.9,
				screenDimension.getHeight()*0.9);

		Application app = new Application();
		app.setSize(screenDimension);
		app.init();
		app.setVisible(true);
	}
}
